body {
    /* background: #f2f2f2; */
    background: #282c34;
}

.frame {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 400px;
    height: 400px;
    margin-top: -200px;
    margin-left: -200px;
    border-radius: 2px;
    box-shadow: 1px 2px 10px 0px rgba(0, 0, 0, 0.3);
    overflow: hidden;
    background: #27ae60;
    color: #fff;
}

.ring {
    position: absolute;
    width: 80px;
    height: 80px;
    top: 80px;
    left: 160px;

    --ringBase: calc(var(--i) - 1);
    --dotsPerCircle: calc(12 + var(--i) * 6);

    .dot {
        position: absolute;
        width: 8px;
        height: 8px;
        top: 40px;
        left: 40px;

        --dotBase: calc(var(--j) - 1);
        --angle: calc(360 / var(--dotsPerCircle));
        --deg: calc(var(--dotBase) * var(--angle) * 1deg);

        --translate3dY: calc(40px - var(--ringBase) * 11px);
        --transOriginY: calc(40px + var(--ringBase) * 11px);

        transform: translate3d(0, var(--translate3dY), 0) rotate(var(--deg));
        transform-origin: 0 var(--transOriginY);

        .fill {
            width: 8px;
            height: 8px;
            background: #fff;
            border-radius: 50%;

            animation: pulsate 2s ease-in-out calc(var(--i) / 3 * 1s) alternate
                infinite both;
        }
    }
}

@keyframes pulsate {
    0% {
        transform: scale(0);
    }
    100% {
        transform: scale(1);
    }
}
